GtkApplication: Add an inhibit api
authorMatthias Clasen <mclasen@redhat.com>
Tue, 3 Jan 2012 20:02:49 +0000 (15:02 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 7 Jan 2012 08:20:56 +0000 (03:20 -0500)
This lets applications block logout and similar actions ahead
of time. Currently only implemented for D-Bus, but Windows has
very similar API since Vista.

gtk/gtk.symbols
gtk/gtkapplication.c
gtk/gtkapplication.h

index ece3c31559a573e9946953c727d9ec01f53c32dc..06ebd7b1d90b9e15e7a9a92193586f3d49ae0edb 100644 (file)
@@ -223,12 +223,15 @@ gtk_application_get_app_menu
 gtk_application_get_menubar
 gtk_application_get_type
 gtk_application_get_windows
+gtk_application_inhibit
+gtk_application_is_inhibited
 gtk_application_new
 gtk_application_quit_response
 gtk_application_remove_accelerator
 gtk_application_remove_window
 gtk_application_set_app_menu
 gtk_application_set_menubar
+gtk_application_uninhibit
 gtk_application_window_get_show_menubar
 gtk_application_window_get_type
 gtk_application_window_new
index 7f3f2521489c30c97d7b9d098dfce5db5dffd0cd..7ee766f641f3254a3ff77e729928646dba31376e 100644 (file)
@@ -1073,6 +1073,7 @@ gtk_application_startup_session_dbus (GtkApplication *app)
   g_variant_unref (res);
 
   g_debug ("Registered client at '%s'", app->priv->client_path);
+
   app->priv->client_proxy = g_dbus_proxy_new_sync (app->priv->session_bus, 0,
                                                    NULL,
                                                    "org.gnome.SessionManager",
@@ -1112,4 +1113,100 @@ gtk_application_quit_response (GtkApplication *application,
                      NULL, NULL, NULL);
 }
 
+guint
+gtk_application_inhibit (GtkApplication             *application,
+                         GtkWindow                  *window,
+                         GtkApplicationInhibitFlags  flags,
+                         const gchar                *reason)
+{
+  GVariant *res;
+  GError *error = NULL;
+  guint cookie;
+  guint xid;
+
+  g_return_val_if_fail (GTK_IS_APPLICATION (application), 0);
+  g_return_val_if_fail (!g_application_get_is_remote (G_APPLICATION (application)), 0);
+  g_return_val_if_fail (application->priv->sm_proxy != NULL, 0);
+
+  g_debug ("Calling Inhibit\n");
+
+  if (window != NULL)
+    xid = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (window)));
+  else
+    xid = 0;
+
+  res = g_dbus_proxy_call_sync (application->priv->sm_proxy,
+                                "Inhibit",
+                                g_variant_new ("(susu)",
+                                               application->priv->app_id,
+                                               xid,
+                                               reason,
+                                               flags),
+                                G_DBUS_CALL_FLAGS_NONE,
+                                G_MAXINT,
+                                NULL,
+                                &error);
+ if (error)
+    {
+      g_warning ("Calling Inhibit failed: %s\n", error->message);
+      g_error_free (error);
+      return 0;
+    }
+
+  g_variant_get (res, "(u)", &cookie);
+  g_variant_unref (res);
+
+  return cookie;
+}
+
+void
+gtk_application_uninhibit (GtkApplication *application,
+                           guint           cookie)
+{
+  g_return_if_fail (GTK_IS_APPLICATION (application));
+  g_return_if_fail (!g_application_get_is_remote (G_APPLICATION (application)));
+  g_return_if_fail (application->priv->sm_proxy != NULL);
+
+  g_dbus_proxy_call (application->priv->sm_proxy,
+                     "Uninhibit",
+                     g_variant_new ("(u)", cookie),
+                     G_DBUS_CALL_FLAGS_NONE,
+                     G_MAXINT,
+                     NULL, NULL, NULL);
+}
+
+gboolean
+gtk_application_is_inhibited (GtkApplication             *application,
+                              GtkApplicationInhibitFlags  flags)
+{
+  GVariant *res;
+  GError *error = NULL;
+  gboolean inhibited;
+
+  g_return_val_if_fail (GTK_IS_APPLICATION (application), FALSE);
+  g_return_val_if_fail (!g_application_get_is_remote (G_APPLICATION (application)), FALSE);
+  g_return_val_if_fail (application->priv->sm_proxy != NULL, FALSE);
+
+  g_debug ("Calling IsInhibited\n");
+
+  res = g_dbus_proxy_call_sync (application->priv->sm_proxy,
+                                "IsInhibited",
+                                g_variant_new ("(u)", flags),
+                                G_DBUS_CALL_FLAGS_NONE,
+                                G_MAXINT,
+                                NULL,
+                                &error);
+  if (error)
+    {
+      g_warning ("Calling IsInhibited failed: %s\n", error->message);
+      g_error_free (error);
+      return FALSE;
+    }
+
+  g_variant_get (res, "(b)", &inhibited);
+  g_variant_unref (res);
+
+  return inhibited;
+}
+
 #endif
index aeb4688cbe01e403cfb5e9305c3f28eedee56434..298e50d27fc8b5c235f8d9b39fe643eccdab3f41 100644 (file)
@@ -99,6 +99,23 @@ void             gtk_application_quit_response      (GtkApplication *application
                                                      gboolean        will_quit,
                                                      const gchar    *reason);
 
+typedef enum
+{
+  GTK_APPLICATION_INHIBIT_LOGOUT  = (1 << 0),
+  GTK_APPLICATION_INHIBIT_SWITCH  = (1 << 1),
+  GTK_APPLICATION_INHIBIT_SUSPEND = (1 << 2),
+  GTK_APPLICATION_INHIBIT_IDLE    = (1 << 3)
+} GtkApplicationInhibitFlags;
+
+guint            gtk_application_inhibit            (GtkApplication             *application,
+                                                     GtkWindow                  *window,
+                                                     GtkApplicationInhibitFlags  flags,
+                                                     const gchar                *reason);
+void             gtk_application_uninhibit          (GtkApplication             *application,
+                                                     guint                       cookie);
+gboolean         gtk_application_is_inhibited       (GtkApplication             *application,
+                                                     GtkApplicationInhibitFlags  flags);
+
 G_END_DECLS
 
 #endif /* __GTK_APPLICATION_H__ */